package com.ruboweb.db;

import java.sql.Connection;
import java.sql.SQLException;

import org.apache.commons.dbcp.BasicDataSource;

import com.ruboweb.domain.Config;
import com.ruboweb.domain.Perfil;
import com.ruboweb.report.ReportUtil;
import com.ruboweb.xml.ParserConfigXml;

/**
 * Clase para crear las conexionas a base de datos a traves de un pool
 * 
 */
public class ConnectionDbHelper {

	/**
	 * Singleton
	 */
	private static ConnectionDbHelper instance;

	/**
	 * Pool de conexiones
	 */
	private BasicDataSource pool;

	/**
	 * Modelo de datos cargado
	 */
	private Config model;

	/**
	 * Perfil que selecciona el usuario para sacar un report
	 */
	private String perfilSelected;

	/**
	 * Constructor
	 */
	private ConnectionDbHelper() {
		this.perfilSelected = "";
		this.model = ParserConfigXml.getInstance().getModel();
	}

	/**
	 * @return Crea el objeto si no existe y lo retorna. Si existe lo retorna
	 */
	public static ConnectionDbHelper getInstance() {

		if (ConnectionDbHelper.instance == null) {
			ConnectionDbHelper.instance = new ConnectionDbHelper();
		}

		return ConnectionDbHelper.instance;
	}

	/**
	 * Crea la conexion con la base de datos indicada
	 * 
	 * @param perfil
	 *            Perfil de acceso a la base de datos definido en el properties
	 * 
	 * @return Conexion establecida con la base de datos a traves de un pool
	 * 
	 */
	public Connection getConnection(String perfil) throws SQLException {

		if (this.perfilSelected.equals(perfil)) {
			if (this.pool == null) {
				return this.crearConexion(perfil);
			} else {
				return this.pool.getConnection();
			}
		} else {
			if (this.pool == null) {
				return this.crearConexion(perfil);
			} else {
				this.pool.close();
				return this.crearConexion(perfil);
			}
		}
	}

	/**
	 * Crea la conexion en el pool para el perfil dado
	 * 
	 * @param perfil
	 *            Nombre del perfil en el XML
	 * 
	 * @return Pool de conexiones
	 */
	private Connection crearConexion(String perfil) throws SQLException {
		Perfil perfilSelected = ReportUtil.buscarPerfil(perfil);

		this.pool = new BasicDataSource();
		this.pool.setDriverClassName(perfilSelected.getDriver());
		this.pool.setUrl(perfilSelected.getUrl());
		this.pool.setUsername(perfilSelected.getUser());
		this.pool.setPassword(ReportUtil.decrypt(perfilSelected.getPass()));

		return this.pool.getConnection();
	}

	/**
	 * @return Recupera y carga el modelo del XML
	 */
	public Config getModel() {
		return this.model;
	}

}
